package com.mathdroid.model.talents.specs;

import java.util.HashMap;
import java.util.LinkedList;

import com.mathdroid.model.enums.ETalentTree;
import com.mathdroid.model.talents.Spec;
import com.mathdroid.model.talents.Talent;

/**
 * Sniper Spec talent trees.
 * @version 19.11.2011
 */
public class Sniper extends Spec {
	private static final long serialVersionUID = 1L;
	
	private static final ETalentTree TREE_0 = ETalentTree.MARKSMAN_S;
	private static final ETalentTree TREE_1 = ETalentTree.ENGINEERING_S;
	private static final ETalentTree TREE_2 = ETalentTree.LETHALITY_S;
	
	public Sniper() {
		this.setName("Untalented Sniper");
		
		this.buildTree0();
		this.buildTree1();
		this.buildTree2();
		
	}

	/**
	 * Build the Marksman tree.
	 */
	private void buildTree0() {
		HashMap<String, Talent> tree0 = new HashMap<String, Talent>();
		this.put(TREE_0, tree0);
		LinkedList<String> description = null;
		String name = null;
		Talent required = null;
		int requiredPointsInTalent = 0;
		int requiredTotalPointsInTree = 0;
		int guiSlot = 0;
		final int pointsSet = 0;
		String imgName = null;
		
		/* ---------------------------- REQ 0 Points ------------------------ */
		requiredTotalPointsInTree = 0;
		
		name = "Marksmanship";
		description = new LinkedList<String>();
		description.add("Increases ranged an tech accuracy by 1%.");
		description.add("Increases ranged an tech accuracy by 2%.");
		description.add("Increases ranged an tech accuracy by 3%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 26;
		imgName = "marktarget";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Steady Shots";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by Snipe, Series of " +
				"Shots and Cull by 3%.");
		description.add("Increases the damage dealt by Snipe, Series of " +
				"Shots and Cull by 6%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 25;
		imgName = "reactiveshots";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Cover Screen";
		description = new LinkedList<String>();
		description.add("When exiting cover, you have a 50% chance to gain " +
				"Cover Screen, increasing defense by 20% for 6 seconds.");
		description.add("When exiting cover, you have a 100% chance to gain " +
		"Cover Screen, increasing defense by 20% for 6 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 24;
		imgName = "energyshield";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 5 Points ------------------------ */
		requiredTotalPointsInTree = 5;
		
		name = "Imperial Demarcation";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Leg Shot by 1.5 seconds.");
		description.add("Reduces the cooldown of Leg Shot by 3 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 23;
		imgName = "linetheshot";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Precision Ambush";
		description = new LinkedList<String>();
		description.add("Ambush ignores 10% of the target's armor.");
		description.add("Ambush ignores 20% of the target's armor.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 22;
		imgName = "blasterhugescope";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Ballistic Dampers";
		description = new LinkedList<String>();
		description.add("Entering cover grants 3 charges of Ballistic " +
				"Dampers. Each charge absorbs 15% of the damage dealt by " +
				"an incoming attack. This effect cannot occur more than " +
				"once every 1.5 seconds. Ballistic Dampers can only be " +
				"gained once every 6 seconds.");
		description.add("Entering cover grants 3 charges of Ballistic " +
				"Dampers. Each charge absorbs 30% of the damage dealt by " +
				"an incoming attack. This effect cannot occur more than " +
				"once every 1.5 seconds. Ballistic Dampers can only be " +
				"gained once every 6 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 21;
		imgName = "heavyarmors";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Heavy Shot";
		description = new LinkedList<String>();
		description.add("When Ambush strikes a target within 10 meters, " +
				"the target is knocked back several meters.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 20;
		imgName = "ambush";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 10 Points ----------------------- */
		requiredTotalPointsInTree = 10;
		
		name = "Reactive Shot";
		description = new LinkedList<String>();
		description.add("Snipe and Series of Shots critical hits have a " +
				"50% chance to reduce the activation time of your next " +
				"Ambush by 1 second.");
		description.add("Snipe and Series of Shots critical hits have a " +
				"100% chance to reduce the activation time of your next " +
				"Ambush by 1 second.");
		required = tree0.get("Precision Ambush");
		requiredPointsInTalent = 2;
		guiSlot = 18;
		imgName = "iaassassin";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Diversion";
		description = new LinkedList<String>();
		description.add("Throws a smoking canister at the target, reducing " +
				"its accuracy by 45% for 9 seconds and exposing the " +
				"target from cover for 6 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 17;
		imgName = "smokegrenade";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Snap Shot";
		description = new LinkedList<String>();
		description.add("Entering cover has a 50% chance to make the next " +
				"Snipe activate instantly.");
		description.add("Entering cover has a 100% chance to make the next " +
				"Snipe activate instantly.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 16;
		imgName = "rifles";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 15 Points ----------------------- */
		requiredTotalPointsInTree = 15;
		
		name = "Sniper's Nest";
		description = new LinkedList<String>();
		description.add("Increases energy regeneration rate by 1 per " +
				"second while in cover.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 15;
		imgName = "takecover";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Sniper Volley";
		description = new LinkedList<String>();
		description.add("Ambush has a 33.3% chance to grant Sniper Volley, " +
				"increasing alacrity by 3% for 6 seconds. While Sniper Volley "
				+ "is active, each subsequent Snipe has a 33.3% chance to " +
						"build an additional stack of Sniper Volley. " +
						"Stacks up to 3 times. The initial Sniper Volley " +
						"effect cannot be gained more than once every 30 " +
						"seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 14;
		imgName = "blindfire";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Sector Ranger";
		description = new LinkedList<String>();
		description.add("Cover Pulse knocks targets back an additional " +
				"2 meters. Additionally reduces " +
				"the activation time of Orbital Strike by 1 second.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 13;
		imgName = "iamilitaryofficer";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Between the Eyes";
		description = new LinkedList<String>();
		description.add("Increases the critical hit chance of Snipe, " +
				"Series of Shots and Followthrough by 2%.");
		description.add("Increases the critical hit chance of Snipe, " +
				"Series of Shots and Followthrough by 4%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 12;
		imgName = "snipe";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 20 Points ----------------------- */
		requiredTotalPointsInTree = 20;
		
		name = "Pillbox Sniper";
		description = new LinkedList<String>();
		description.add("Reduces cooldown of Entrench and Orbital Strike " +
				"by 7.5 seconds.");
		description.add("Reduces cooldown of Entrench and Orbital Strike " +
				"by 15 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 10;
		imgName = "childoftheempire";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Followthrough";
		description = new LinkedList<String>();
		description.add("Fires a well-controlled follow-up shot at the " +
				"target that deals " +
				"(LvlRankDmgAmnt * 0.227 + WeaponDamage * 2.27) weapon damage. " 
				+ "Only usable within the 4.5 seconds immediately following " +
				"a Sniper or Ambush.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 9;
		imgName = "followthrough";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		name = "Recoil Control";
		description = new LinkedList<String>();
		description.add("Reduces the energy cost of Followthrough by 2 and " +
				"reduces its cooldown by 1.5 seconds.");
		description.add("Reduces the energy cost of Followthrough by 4 and " +
				"reduces its cooldown by 3 seconds.");
		required = tree0.get("Followthrough");
		requiredPointsInTalent = 1;
		guiSlot = 8;
		imgName = "rifleshot";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 25 Points ----------------------- */
		requiredTotalPointsInTree = 25;
		
		name = "Imperial Assassin";
		description = new LinkedList<String>();
		description.add("Increases the critical damage dealt by Series of " +
				"Shots, Takedown and Followthrough by 6%.");
		description.add("Increases the critical damage dealt by Series of " +
		"Shots, Takedown and Followthrough by 12%.");
		description.add("Increases the critical damage dealt by Series of " +
		"Shots, Takedown and Followthrough by 18%.");
		description.add("Increases the critical damage dealt by Series of " +
		"Shots, Takedown and Followthrough by 24%.");
		description.add("Increases the critical damage dealt by Series of " +
		"Shots, Takedown and Followthrough by 30%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 5;
		imgName = "imperialagent";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
		
		/* ---------------------------- REQ 30 Points ----------------------- */
		requiredTotalPointsInTree = 30;
		
		name = "Rapid Fire";
		description = new LinkedList<String>();
		description.add("Immediately finishes the cooldown on Series " +
				"of Shots and triggers the next Series of Shots trigger " +
				"without a cooldown.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 1;
		imgName = "lockandload";
		tree0.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_0, imgName));
	}
	
	/**
	 * Build the Engineer tree.
	 */
	private void buildTree1() {
		HashMap<String, Talent> tree1 = new HashMap<String, Talent>();
		this.put(TREE_1, tree1);
		LinkedList<String> description = null;
		String name = null;
		Talent required = null;
		int requiredPointsInTalent = 0;
		int requiredTotalPointsInTree = 0;
		int guiSlot = 0;
		final int pointsSet = 0;
		String imgName = null;
		
		/* ---------------------------- REQ 0 Points ------------------------ */
		requiredTotalPointsInTree = 0;
		
		name = "Gearhead";
		description = new LinkedList<String>();
		description.add("Increases total cunning by 3%.");
		description.add("Increases total cunning by 6%.");
		description.add("Increases total cunning by 9%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 27;
		imgName = "souterrimpirate";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Energy Tanks";
		description = new LinkedList<String>();
		description.add("Increases maximum energy by 5.");
		description.add("Increases maximum energy by 10.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 26;
		imgName = "powercore";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Engineer's Tool Belt";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Flash Bang by 7.5 " +
				"seconds and Fragmentation Grenade by 1.5 seconds.");
		description.add("Reduces the cooldown of Flash Bang by 15 " +
				"seconds and Fragmentation Grenade by 3 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 25;
		imgName = "utilitybeltwithmanyslots";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 5 Points ------------------------ */
		requiredTotalPointsInTree = 5;
		
		name = "Vitality Serum";
		description = new LinkedList<String>();
		description.add("Increases total endurance by 2%.");
		description.add("Increases total endurance by 4%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 23;
		imgName = "lightsaberpowercellb";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Calculated Pursuit";
		description = new LinkedList<String>();
		description.add("You have a 50% chance to gain Calculated Pursuit " +
				"upon exiting cover, allowing your next Snipe to be used " +
				"in any situation.");
		description.add("You have a 100% chance to gain Calculated Pursuit " +
				"upon exiting cover, allowing your next Snipe to be used " +
				"in any situation.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 22;
		imgName = "swwarhardenednoble";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Vital Regulators";
		description = new LinkedList<String>();
		description.add("Adrenaline Probe now heals you for 3% of your " +
				"total health over 3 seconds.");
		description.add("Adrenaline Probe now heals you for 6% of your " +
		"total health over 3 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 21;
		imgName = "rapidscan";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Explosive Engineering";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by Explosive Probe and " +
				"all area effects by 5%.");
		description.add("Increases the damage dealt by Explosive Probe and " +
				"all area effects by 10%.");
		description.add("Increases the damage dealt by Explosive Probe and " +
				"all area effects by 15%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 20;
		imgName = "explosiveprobe";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 10 Points ----------------------- */
		requiredTotalPointsInTree = 10;
		
		name = "Interrogation Probe";
		description = new LinkedList<String>();
		description.add("Summons an interrogation probe that clings to the " +
				"target and deals " +
				"((LvlRankDmgAmnt * 0.055 + SpellPower * 0.55) * 7) " +
				"energy damage over 18 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 18;
		imgName = "sonicprobe";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Inventive Interrogation Techniques";
		description = new LinkedList<String>();
		description.add("Interrogation Probe reduces the target's movement " +
				"speed by 15% for the duration.");
		description.add("Interrogation Probe reduces the target's movement " +
				"speed by 30% for the duration.");
		required = tree1.get("Interrogation Probe");
		requiredPointsInTalent = 1;
		guiSlot = 19;
		imgName = "surveyorskit";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Efficient Engineering";
		description = new LinkedList<String>();
		description.add("Reduces the energy cost of Explosive Probe, " +
				"Interrogation Probe and Plasma Probe by 2.");
		description.add("Reduces the energy cost of Explosive Probe, " +
				"Interrogation Probe and Plasma Probe by 4.");
		requiredPointsInTalent = 1;
		required = tree1.get("Interrogation Probe");
		guiSlot = 17;
		imgName = "slicing";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Cluster Bombs";
		description = new LinkedList<String>();
		description.add("After Explosive Probe detonates, it drops 1 " +
				"cluster bomb on the target. A Cluster Bomb explodes " +
				"when damaged by blaster fire, dealing " +
				"(LvlRankDmgAmnt * 0.047 + SpellPower * 0.47) kinetic " +
				"damage to the target. Cluster Bombs cannot be detonated " +
				"more than once every 1.5 seconds.");
		description.add("After Explosive Probe detonates, it drops 2 " +
				"cluster bomb on the target. A Cluster Bomb explodes " +
				"when damaged by blaster fire, dealing " +
				"(LvlRankDmgAmnt * 0.047 + SpellPower * 0.47) kinetic " +
				"damage to the target. Cluster Bombs cannot be detonated " +
				"more than once every 1.5 seconds.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 16;
		imgName = "democharge";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 15 Points ----------------------- */
		requiredTotalPointsInTree = 15;
		
		name = "Experimental Explosives";
		description = new LinkedList<String>();
		description.add("Increases the critical damage dealt by all area " +
				"effects by 15%.");
		description.add("Increases the critical damage dealt by all area " +
				"effects by 30%.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 15;
		imgName = "thermaldetonation";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Stroke of Genius";
		description = new LinkedList<String>();
		description.add("Activating Cover Pulse has a 50% chance of making " +
				"the next Snipe activate instantly.");
		description.add("Activating Cover Pulse has a 100% chance of making " +
				"the next Snipe activate instantly.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 13;
		imgName = "iachisssecretpolice";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Imperial Methodology";
		description = new LinkedList<String>();
		description.add("Increases the number of cluster bombs dropped " +
				"by Explosive Probe by 1. In addition, when the cluster " +
				"bombs detonate, you recover 5 energy.");
		requiredPointsInTalent = 2;
		required = tree1.get("Cluster Bombs");
		guiSlot = 12;
		imgName = "shrapnelburst";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 20 Points ----------------------- */
		requiredTotalPointsInTree = 20;
		
		name = "Augmented Shields";
		description = new LinkedList<String>();
		description.add("Increases the amount of damage absorbed by " +
				"Shield Probe by 15%.");
		description.add("Increases the amount of damage absorbed by " +
				"Shield Probe by 30%.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 11;
		imgName = "shieldprobe";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "EMP Discharge";
		description = new LinkedList<String>();
		description.add("Discharges an electromagnetic pulse from an " +
				"active Interrogation Probe on the target, immediately " +
				"dealing (LvlRankDmgAmnt * 0.07 + SpellPower) - " +
				"(LvlRankDmgAmnt * 0.13 + SpellPower) energy damage " +
				"to the affected target. Also immediately finsihes the " +
				"cooldown on Adrenaline Probe and Shield Probe.");
		requiredPointsInTalent = 1;
		required = tree1.get("Interrogation Probe");
		guiSlot = 10;
		imgName = "detonateprobe";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Energy Overrides";
		description = new LinkedList<String>();
		description.add("After activating Detonation Probes, the next " +
				"Explosive Probe or Plasma Probe used costs 50% less energy.");
		description.add("After activating Detonation Probes, the next " +
				"Explosive Probe or Plasma Probe used costs 100% less energy.");
		requiredPointsInTalent = 1;
		required = tree1.get("Detonate Probes");
		guiSlot = 9;
		imgName = "ionclip";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 25 Points ----------------------- */
		requiredTotalPointsInTree = 25;
		
		name = "Electrified Railgun";
		description = new LinkedList<String>();
		description.add("Series of Shots has a 33.3% chance when dealing " +
				"damage to electrify the target, dealing " +
				"((LvlRankDmgAmnt * 0.005 + SpellPower * 0.05) * 5) elemental "
				+ "damage over 4 seconds. Stacks up to 4 times.");
		description.add("Series of Shots has a 66.7% chance when dealing " +
				"damage to electrify the target, dealing " +
				"((LvlRankDmgAmnt * 0.005 + SpellPower * 0.05) * 5) elemental "
				+ "damage over 4 seconds. Stacks up to 4 times.");
		description.add("Series of Shots has a 100% chance when dealing " +
				"damage to electrify the target, dealing " +
				"((LvlRankDmgAmnt * 0.005 + SpellPower * 0.05) * 5) elemental "
				+ "damage over 4 seconds. Stacks up to 4 times.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 6;
		imgName = "electrostaves";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		name = "Deployed Shields";
		description = new LinkedList<String>();
		description.add("Reduces all damage taken while in cover by 3% " +
				"and reduces the cooldown of Ballistic Shield by 15 seconds.");
		description.add("Reduces all damage taken while in cover by 6% " +
		"and reduces the cooldown of Ballistic Shield by 30 seconds.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 5;
		imgName = "bioelectricshieldenhancer";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
		
		/* ---------------------------- REQ 30 Points ----------------------- */
		requiredTotalPointsInTree = 30;
		
		name = "Plasma Probe";
		description = new LinkedList<String>();
		description.add("Deploys a plasma drone over the target " +
				"area that deals " +
				"((LvlRankDmgAmnt * 0.024 + SpellPower * 0.44) * 6) - " +
				"((LvlRankDmgAmnt * 0.064 + SpellPower * 0.44) * 6) " +
				"elemental damage over 18 seconds " +
				"to up to 3 enemies within 5 meters.");
		requiredPointsInTalent = 0;
		required = null;
		guiSlot = 2;
		imgName = "plasmaprobe";
		tree1.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_1, imgName));
	}
	
	/**
	 * Build the Lethality tree.
	 */
	private void buildTree2() {
		HashMap<String, Talent> tree2 = new HashMap<String, Talent>();
		this.put(TREE_2, tree2);
		LinkedList<String> description = null;
		String name = null;
		Talent required = null;
		int requiredPointsInTalent = 0;
		int requiredTotalPointsInTree = 0;
		int guiSlot = 0;
		final int pointsSet = 0;
		String imgName = null;
		
		/* ---------------------------- REQ 0 Points ------------------------ */
		requiredTotalPointsInTree = 0;
		
		name = "Razor Edge";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by Shiv by 5%.");
		description.add("Increases the damage dealt by Shiv by 10%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 27;
		imgName = "shiv";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Lethality";
		description = new LinkedList<String>();
		description.add("Increases critical strike chance by 2%.");
		description.add("Increases critical strike chance by 4%.");
		description.add("Increases critical strike chance by 6%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 26;
		imgName = "recklessness";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Deadly Directive";
		description = new LinkedList<String>();
		description.add("Increases alacrity by 2%");
		description.add("Increases alacrity by 4%");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 25;
		imgName = "rattaki";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 5 Points ------------------------ */
		requiredTotalPointsInTree = 5;
		
		name = "Lethal Injectors";
		description = new LinkedList<String>();
		description.add("Increases the duration of Corrosive Dart by " +
				"3 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 23;
		imgName = "hypo4";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Corrosive Mircobes";
		description = new LinkedList<String>();
		description.add("Corrosive Dart has a 12.5% chance to tick twice " +
				"when it inflicts damage.");
		description.add("Corrosive Dart has a 25% chance to tick twice " +
				"when it inflicts damage.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 22;
		imgName = "fungalsample1";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Flash Powder";
		description = new LinkedList<String>();
		description.add("Reduces all target's accuracy by 10% for 8 seconds " +
				"after Flash Bang ends.");
		description.add("Reduces all target's accuracy by 20% for 8 seconds " +
				"after Flash Bang ends.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 21;
		imgName = "drugmedicinecolorvariant1";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Slip Away";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Debilitate by 7.5 seconds, " +
				"and increases movement speed by 15% for 4 seconds " +
				"after activating Debilitate.");
		description.add("Reduces the cooldown of Debilitate by 15 seconds, " +
				"and increases movement speed by 30% for 4 seconds " +
				"after activating Debilitate.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 20;
		imgName = "hamstring";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 10 Points ----------------------- */
		requiredTotalPointsInTree = 10;
		
		name = "Cut Down";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by Overload Shot and " +
				"Cull by 3%.");
		description.add("Increases the damage dealt by Overload Shot and " +
				"Cull by 6%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 19;
		imgName = "linetheshot";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Targeted Demolition";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by Fragmentation " +
				"Grenade and Corrosive Grenade by 4%.");
		description.add("Increases the damage dealt by Fragmentation " +
				"Grenade and Corrosive Grenade by 8%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 18;
		imgName = "security";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Corrosive Grenade";
		description = new LinkedList<String>();
		description.add("Hurls a corrosive grenade that spews acid in a " +
				"5-meter radius on impact, dealing " +
				"((LvlRankDmgAmnt * 0.032 + SpellPower * 0.32) * 8) " +
				"internal damage " +
				"over 21 seconds to up tp 3 targets.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 17;
		imgName = "stickygrenade";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 15 Points ----------------------- */
		requiredTotalPointsInTree = 15;
		
		name = "Lethal Dose";
		description = new LinkedList<String>();
		description.add("Increases the critical hit chance of all " +
				"periodic effects by 4%.");
		description.add("Increases the critical hit chance of all " +
				"periodic effects by 8%.");
		description.add("Increases the critical hit chance of all " +
				"periodic effects by 12%.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 15;
		imgName = "creepingterror";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Vanish";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Evasion by 7.5 " +
				"seconds and Escape by 15 seconds.");
		description.add("Reduces the cooldown of Evasion by 15 " +
				"seconds and Escape by 30 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 14;
		imgName = "escape";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Adhesive Corrosives";
		description = new LinkedList<String>();
		description.add("Corrosive Grenade has a 50% chance to reduce the " +
				"movement speed of all targets by 30% for 6 seconds.");
		description.add("Corrosive Grenade has a 100% chance to reduce the " +
				"movement speed of all targets by 30% for 6 seconds.");
		required = tree2.get("Corrosive Grenade");
		requiredPointsInTalent = 1;
		guiSlot = 13;
		imgName = "movementslowed";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Lethal Purpose";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Adrenaline Probe by " +
				"15 seconds. In addition, critical hits with poison " +
				"effects restore 1 energy.");
		description.add("Reduces the cooldown of Adrenaline Probe by " +
				"30 seconds. In addition, critical hits with poison " +
				"effects restore 2 energy.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 12;
		imgName = "assassinstraining";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 20 Points ----------------------- */
		requiredTotalPointsInTree = 20;
		
		name = "Counter Strike";
		description = new LinkedList<String>();
		description.add("Countermeasures has a 50% strike chance to remove " +
				"all movement-imparing effects when activated.");
		description.add("Countermeasures has a 100% strike chance to remove " +
		"all movement-imparing effects when activated.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 11;
		imgName = "subterfuge";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Cull";
		description = new LinkedList<String>();
		description.add("Fires a volley of bolts at the target, " +
				"dealing (LvlRankDmgAmnt * 0.078 + WeaponDamage * 0.78) " +
				"weapon damage each second, For each " +
				"of your poison effects present on the target, " +
				"the target is culled for an additional " +
				"(LvlRankDmgAmnt * 0.038 + SpellPower * 0.38) " +
				"internal damage each second.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 9;
		imgName = "cull";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Razor Rounds";
		description = new LinkedList<String>();
		description.add("Increases the critical chance of Cull and " +
				"Series of Shots by 2%.");
		description.add("Increases the critical chance of Cull and " +
				"Series of Shots by 4%.");
		required = tree2.get("Cull");
		requiredPointsInTalent = 1;
		guiSlot = 10;
		imgName = "ammobelt";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 25 Points ----------------------- */
		requiredTotalPointsInTree = 25;
		
		name = "Hold Your Ground";
		description = new LinkedList<String>();
		description.add("Reduces the cooldown of Shield Probe by 7.5 seconds " +
				"and Cover Pulse by 5 seconds.");
		description.add("Reduces the cooldown of Shield Probe by 15 seconds " +
		"and Cover Pulse by 10 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 6;
		imgName = "cover";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		name = "Devouring Microbes";
		description = new LinkedList<String>();
		description.add("Increases the damage dealt by poison effects by 5% " +
				"on targets below 30% of max health.");
		description.add("Increases the damage dealt by poison effects by 10% " +
				"on targets below 30% of max health.");
		description.add("Increases the damage dealt by poison effects by 15% " +
				"on targets below 30% of max health.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 5;
		imgName = "wither";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
		
		/* ---------------------------- REQ 30 Points ----------------------- */
		requiredTotalPointsInTree = 30;
		
		name = "Weakening Blast";
		description = new LinkedList<String>();
		description.add("Deals (LvlRankDmgAmnt * 0.087 + WeaponDamage * 0.87)" +
				" weapon damage and causes the target to " +
				"take 30% additional damage drom the Agent's next 10 " +
				"poison effects. Lasts 15 seconds.");
		required = null;
		requiredPointsInTalent = 0;
		guiSlot = 1;
		imgName = "defensivecommand";
		tree2.put(name, new Talent(name, 
				description, required, requiredPointsInTalent, 
				requiredTotalPointsInTree, guiSlot, pointsSet, 
				TREE_2, imgName));
	}
}
